import os
import sys
import subprocess
from dotenv import load_dotenv

# 加载环境变量
load_dotenv()

def check_environment():
    """检查环境配置是否完整"""
    missing_vars = []
    
    # 检查必要的环境变量
    if not os.getenv('TENCENT_CLOUD_SECRET_ID'):
        missing_vars.append('TENCENT_CLOUD_SECRET_ID')
    if not os.getenv('TENCENT_CLOUD_SECRET_KEY'):
        missing_vars.append('TENCENT_CLOUD_SECRET_KEY')
    
    # 如果有缺失的环境变量，提示用户
    if missing_vars:
        print("\n警告：以下必要的环境变量未配置：")
        for var in missing_vars:
            print(f"  - {var}")
        print("\n请在.env文件中配置这些变量。")
        print("示例：")
        print("TENCENT_CLOUD_SECRET_ID=your_secret_id_here")
        print("TENCENT_CLOUD_SECRET_KEY=your_secret_key_here")
        print("\n服务仍将启动，但调用API时可能会失败。\n")

def install_dependencies():
    """安装项目依赖"""
    print("正在安装项目依赖...")
    try:
        subprocess.check_call([sys.executable, '-m', 'pip', 'install', '-r', 'requirements.txt'])
        print("依赖安装完成。\n")
    except subprocess.CalledProcessError as e:
        print(f"依赖安装失败: {str(e)}")
        sys.exit(1)

def start_server(host=None, port=None, reload=True):
    """
    启动FastAPI服务器
    
    :param host: 主机地址，默认从环境变量读取或使用0.0.0.0
    :param port: 端口号，默认从环境变量读取或使用8080
    :param reload: 是否启用自动重载
    """
    # 使用参数或环境变量或默认值
    host = host or os.getenv("HOST", "0.0.0.0")
    port = port or int(os.getenv("PORT", 8080))
    
    # 构建uvicorn命令参数
    cmd = [
        sys.executable,
        '-m', 'uvicorn',
        'main:app',
        '--host', host,
        '--port', str(port)
    ]
    
    # 如果启用自动重载，添加--reload参数
    if reload:
        cmd.append('--reload')
    
    print(f"3D模型生成服务启动中...")
    print(f"服务将运行在: http://{host}:{port}")
    print(f"API文档: http://{host}:{port}/docs")
    print(f"按Ctrl+C停止服务。\n")
    
    try:
        # 启动服务器
        subprocess.run(cmd)
    except KeyboardInterrupt:
        print("\n服务已停止。")
    except Exception as e:
        print(f"服务启动失败: {str(e)}")
        sys.exit(1)

def main():
    """主函数"""
    # 解析命令行参数
    import argparse
    parser = argparse.ArgumentParser(description='启动3D模型生成服务')
    parser.add_argument('--host', type=str, help='主机地址')
    parser.add_argument('--port', type=int, help='端口号')
    parser.add_argument('--no-reload', action='store_true', help='禁用自动重载')
    parser.add_argument('--install', action='store_true', help='安装依赖后启动')
    
    args = parser.parse_args()
    
    # 检查环境配置
    check_environment()
    
    # 如果指定了安装依赖
    if args.install:
        install_dependencies()
    
    # 启动服务器
    start_server(
        host=args.host,
        port=args.port,
        reload=not args.no_reload
    )

if __name__ == "__main__":
    main()